package com.cloud.jvm.ref;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

/**
 * @version v1.0
 * @author: TianXiang
 * @description: 虚引用- 将对象包装了一层
 * @date: 2021/5/31
 */
public class PhantomRef {

    public static void main(String[] args) {

        Object o1 = new Object();
        ReferenceQueue queue = new ReferenceQueue();
        PhantomReference<Object> phantomRef = new PhantomReference<>(o1, queue);
        System.out.println(o1);// java.lang.Object@2957fcb0
        System.out.println(phantomRef.get());// null
        // 引用队列在GC前是空的
        System.out.println(queue.poll());// null

        o1 = null;
        System.gc();
        System.out.println("==========================================================");

        System.out.println(o1);// null
        System.out.println(phantomRef.get());// null
        // 在GC后引用的对象会被加入到引用队列, JVM允许对象被销毁前做通知处理
        System.out.println(queue);// java.lang.ref.ReferenceQueue@1376c05c


    }

}
